/*
 CLEditor WYSIWYG HTML Editor v1.3.0
 http://www.dhf.web.id/
 requires jQuery v1.4.2 or later

 Copyright 2010, Dharla Ferdana.
 Dual licensed under the MIT or GPL Version 2 licenses.
*/
(function (e) {
    function aa(a) {
        var b = this,
            c = a.target,
            d = e.data(c, x),
            h = s[d],
            f = h.popupName,
            i = p[f];
        if (!(b.disabled || e(c).attr(n) == n)) {
            var g = {
                editor: b,
                button: c,
                buttonName: d,
                popup: i,
                popupName: f,
                command: h.command,
                useCSS: b.options.useCSS
            };
            if (h.buttonClick && h.buttonClick(a, g) === false) return false;
            if (d == "source") {
                if (t(b)) {
                    delete b.range;
                    b.$area.hide();
                    b.$frame.show();
                    c.title = h.title
                } else {
                    b.$frame.hide();
                    b.$area.show();
                    c.title = "Show Rich Text"
                }
                setTimeout(function () {
                    u(b)
                }, 100)
            } else if (!t(b)) if (f) {
                    var j = e(i);
                    if (f ==
                        "url") {
                        if (d == "link" && M(b) === "") {
                            z(b, "A selection is required when inserting a link.", c);
                            return false
                        }
                        j.children(":button").unbind(q).bind(q, function () {
                            var k = j.find(":text"),
                                o = e.trim(k.val());
                            o !== "" && v(b, g.command, o, null, g.button);
                            k.val("http://");
                            r();
                            w(b)
                        })
                    } else f == "pastetext" && j.children(":button").unbind(q).bind(q, function () {
                            var k = j.find("textarea"),
                                o = k.val().replace(/\n/g, "<br />");
                            o !== "" && v(b, g.command, o, null, g.button);
                            k.val("");
                            r();
                            w(b)
                        }); if (c !== e.data(i, A)) {
                        N(b, i, c);
                        return false
                    }
                    return
                } else if (d ==
                "print") b.$frame[0].contentWindow.print();
            else if (!v(b, g.command, g.value, g.useCSS, c)) return false;
            w(b)
        }
    }

    function O(a) {
        a = e(a.target).closest("div");
        a.css(H, a.data(x) ? "#FFF" : "#FFC")
    }

    function P(a) {
        e(a.target).closest("div").css(H, "transparent")
    }

    function ba(a) {
        var b = a.data.popup,
            c = a.target;
        if (!(b === p.msg || e(b).hasClass(B))) {
            var d = e.data(b, A),
                h = e.data(d, x),
                f = s[h],
                i = f.command,
                g, j = this.options.useCSS;
            if (h == "font") g = c.style.fontFamily.replace(/"/g, "");
            else if (h == "size") {
                if (c.tagName == "DIV") c = c.children[0];
                g = c.innerHTML
            } else if (h == "style") g = "<" + c.tagName + ">";
            else if (h == "color") g = Q(c.style.backgroundColor);
            else if (h == "highlight") {
                g = Q(c.style.backgroundColor);
                if (l) i = "backcolor";
                else j = true
            }
            b = {
                editor: this,
                button: d,
                buttonName: h,
                popup: b,
                popupName: f.popupName,
                command: i,
                value: g,
                useCSS: j
            };
            if (!(f.popupClick && f.popupClick(a, b) === false)) {
                if (b.command && !v(this, b.command, b.value, b.useCSS, d)) return false;
                r();
                w(this)
            }
        }
    }

    function C(a) {
        for (var b = 1, c = 0, d = 0; d < a.length; ++d) {
            b = (b + a.charCodeAt(d)) % 65521;
            c = (c + b) % 65521
        }
        return c <<
            16 | b
    }

    function R(a, b, c, d, h) {
        if (p[a]) return p[a];
        var f = e(m).hide().addClass(ca).appendTo("body");
        if (d) f.html(d);
        else if (a == "color") {
            b = b.colors.split(" ");
            b.length < 10 && f.width("auto");
            e.each(b, function (i, g) {
                e(m).appendTo(f).css(H, "#" + g)
            });
            c = da
        } else if (a == "font") e.each(b.fonts.split(","), function (i, g) {
                e(m).appendTo(f).css("fontFamily", g).html(g)
            });
        else if (a == "size") e.each(b.sizes.split(","), function (i, g) {
                e(m).appendTo(f).html("<font size=" + g + ">" + g + "</font>")
            });
        else if (a == "style") e.each(b.styles, function (i,
                g) {
                e(m).appendTo(f).html(g[1] + g[0] + g[1].replace("<", "</"))
            });
        else if (a == "url") {
            f.html('Enter URL:<br><input type=text value="http://" size=35><br><input type=button value="Submit">');
            c = B
        } else if (a == "pastetext") {
            f.html("Paste your content here and click submit.<br /><textarea cols=40 rows=3></textarea><br /><input type=button value=Submit>");
            c = B
        }
        if (!c && !d) c = S;
        f.addClass(c);
        l && f.attr(I, "on").find("div,font,p,h1,h2,h3,h4,h5,h6").attr(I, "on");
        if (f.hasClass(S) || h === true) f.children().hover(O, P);
        p[a] = f[0];
        return f[0]
    }

    function T(a, b) {
        if (b) {
            a.$area.attr(n, n);
            a.disabled = true
        } else {
            a.$area.removeAttr(n);
            delete a.disabled
        }
        try {
            if (l) a.doc.body.contentEditable = !b;
            else a.doc.designMode = !b ? "on" : "off"
        } catch (c) {}
        u(a)
    }

    function v(a, b, c, d, h) {
        D(a);
        if (!l) {
            if (d === undefined || d === null) d = a.options.useCSS;
            a.doc.execCommand("styleWithCSS", 0, d.toString())
        }
        d = true;
        var f;
        if (l && b.toLowerCase() == "inserthtml") y(a).pasteHTML(c);
        else {
            try {
                d = a.doc.execCommand(b, 0, c || null)
            } catch (i) {
                f = i.description;
                d = false
            }
            d || ("cutcopypaste".indexOf(b) > -1 ? z(a, "For security reasons, your browser does not support the " + b + " command. Try using the keyboard shortcut or context menu instead.", h) : z(a, f ? f : "Error executing the " + b + " command.", h))
        }
        u(a);
        return d
    }

    function w(a) {
        setTimeout(function () {
            t(a) ? a.$area.focus() : a.$frame[0].contentWindow.focus();
            u(a)
        }, 0)
    }

    function y(a) {
        if (l) return J(a).createRange();
        return J(a).getRangeAt(0)
    }

    function J(a) {
        if (l) return a.doc.selection;
        return a.$frame[0].contentWindow.getSelection()
    }

    function Q(a) {
        var b = /rgba?\((\d+), (\d+), (\d+)/.exec(a),
            c = a.split("");
        if (b) for (a = (b[1] << 16 | b[2] << 8 | b[3]).toString(16); a.length < 6;) a = "0" + a;
        return "#" + (a.length == 6 ? a : c[1] + c[1] + c[2] + c[2] + c[3] + c[3])
    }

    function r() {
        e.each(p, function (a, b) {
            e(b).hide().unbind(q).removeData(A)
        })
    }

    function U() {
        var a = e("link[href$='jquery.cleditor.css']").attr("href");
        return a.substr(0, a.length - 19) + "images/"
    }

    function K(a) {
        var b = a.$main,
            c = a.options;
        a.$frame && a.$frame.remove();
        var d = a.$frame = e('<iframe frameborder="0" src="javascript:true;">').hide().appendTo(b),
            h = d[0].contentWindow,
            f =
                a.doc = h.document,
            i = e(f);
        f.open();
        f.write(c.docType + "<html>" + (c.docCSSFile === "" ? "" : '<head><link rel="stylesheet" type="text/css" href="' + c.docCSSFile + '" /></head>') + '<body style="' + c.bodyStyle + '"></body></html>');
        f.close();
        l && i.click(function () {
            w(a)
        });
        E(a);
        if (l) {
            i.bind("beforedeactivate beforeactivate selectionchange keypress", function (g) {
                if (g.type == "beforedeactivate") a.inactive = true;
                else if (g.type == "beforeactivate") {
                    !a.inactive && a.range && a.range.length > 1 && a.range.shift();
                    delete a.inactive
                } else if (!a.inactive) {
                    if (!a.range) a.range = [];
                    for (a.range.unshift(y(a)); a.range.length > 2;) a.range.pop()
                }
            });
            d.focus(function () {
                D(a)
            })
        }(e.browser.mozilla ? i : e(h)).blur(function () {
            V(a, true)
        });
        i.click(r).bind("keyup mouseup", function () {
            u(a)
        });
        L ? a.$area.show() : d.show();
        e(function () {
            var g = a.$toolbar,
                j = g.children("div:last"),
                k = b.width();
            j = j.offset().top + j.outerHeight() - g.offset().top + 1;
            g.height(j);
            j = (/%/.test("" + c.height) ? b.height() : parseInt(c.height)) - j;
            d.width(k).height(j);
            a.$area.width(k).height(ea ? j - 2 : j);
            T(a, a.disabled);
            u(a)
        })
    }

    function u(a) {
        if (!L &&
            e.browser.webkit && !a.focused) {
            a.$frame[0].contentWindow.focus();
            window.focus();
            a.focused = true
        }
        var b = a.doc;
        if (l) b = y(a);
        var c = t(a);
        e.each(a.$toolbar.find("." + W), function (d, h) {
            var f = e(h),
                i = e.cleditor.buttons[e.data(h, x)],
                g = i.command,
                j = true;
            if (a.disabled) j = false;
            else if (i.getEnabled) {
                j = i.getEnabled({
                    editor: a,
                    button: h,
                    buttonName: i.name,
                    popup: p[i.popupName],
                    popupName: i.popupName,
                    command: i.command,
                    useCSS: a.options.useCSS
                });
                if (j === undefined) j = true
            } else if ((c || L) && i.name != "source" || l && (g == "undo" || g == "redo")) j =
                    false;
            else if (g && g != "print") {
                if (l && g == "hilitecolor") g = "backcolor";
                if (!l || g != "inserthtml") try {
                        j = b.queryCommandEnabled(g)
                } catch (k) {
                    j = false
                }
            }
            if (j) {
                f.removeClass(X);
                f.removeAttr(n)
            } else {
                f.addClass(X);
                f.attr(n, n)
            }
        })
    }

    function D(a) {
        l && a.range && a.range[0].select()
    }

    function M(a) {
        D(a);
        if (l) return y(a).text;
        return J(a).toString()
    }

    function z(a, b, c) {
        var d = R("msg", a.options, fa);
        d.innerHTML = b;
        N(a, d, c)
    }

    function N(a, b, c) {
        var d, h, f = e(b);
        if (c) {
            var i = e(c);
            d = i.offset();
            h = --d.left;
            d = d.top + i.height()
        } else {
            i = a.$toolbar;
            d = i.offset();
            h = Math.floor((i.width() - f.width()) / 2) + d.left;
            d = d.top + i.height() - 2
        }
        r();
        f.css({
            left: h,
            top: d
        }).show();
        if (c) {
            e.data(b, A, c);
            f.bind(q, {
                popup: b
            }, e.proxy(ba, a))
        }
        setTimeout(function () {
            f.find(":text,textarea").eq(0).focus().select()
        }, 100)
    }

    function t(a) {
        return a.$area.is(":visible")
    }

    function E(a, b) {
        var c = a.$area.val(),
            d = a.options,
            h = d.updateFrame,
            f = e(a.doc.body);
        if (h) {
            var i = C(c);
            if (b && a.areaChecksum == i) return;
            a.areaChecksum = i
        }
        c = h ? h(c) : c;
        c = c.replace(/<(?=\/?script)/ig, "&lt;");
        if (d.updateTextArea) a.frameChecksum =
                C(c);
        if (c != f.html()) {
            f.html(c);
            e(a).triggerHandler(F)
        }
    }

    function V(a, b) {
        var c = e(a.doc.body).html(),
            d = a.options,
            h = d.updateTextArea,
            f = a.$area;
        if (h) {
            var i = C(c);
            if (b && a.frameChecksum == i) return;
            a.frameChecksum = i
        }
        c = h ? h(c) : c;
        if (d.updateFrame) a.areaChecksum = C(c);
        if (c != f.val()) {
            f.val(c);
            e(a).triggerHandler(F)
        }
    }
    e.cleditor = {
        defaultOptions: {
            width: 500,
            height: 250,
            controls: "bold italic underline strikethrough subscript superscript | font size style | color highlight removeformat | bullets numbering | outdent indent | alignleft center alignright justify | undo redo | rule image link unlink | cut copy paste pastetext | print source",
            colors: "FFF FCC FC9 FF9 FFC 9F9 9FF CFF CCF FCF CCC F66 F96 FF6 FF3 6F9 3FF 6FF 99F F9F BBB F00 F90 FC6 FF0 3F3 6CC 3CF 66C C6C 999 C00 F60 FC3 FC0 3C0 0CC 36F 63F C3C 666 900 C60 C93 990 090 399 33F 60C 939 333 600 930 963 660 060 366 009 339 636 000 300 630 633 330 030 033 006 309 303",
            fonts: "Arial,Arial Black,Comic Sans MS,Courier New,Narrow,Garamond,Georgia,Impact,Sans Serif,Serif,Tahoma,Trebuchet MS,Verdana",
            sizes: "1,2,3,4,5,6,7",
            styles: [
                ["Paragraph", "<p>"],
                ["Header 1", "<h1>"],
                ["Header 2", "<h2>"],
                ["Header 3", "<h3>"],
                ["Header 4", "<h4>"],
                ["Header 5", "<h5>"],
                ["Header 6", "<h6>"]
            ],
            useCSS: false,
            docType: '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
            docCSSFile: "",
            bodyStyle: "margin:4px; font:10pt Arial,Verdana; cursor:text"
        },
        buttons: {
            init: "bold,,|italic,,|underline,,|strikethrough,,|subscript,,|superscript,,|font,,fontname,|size,Font Size,fontsize,|style,,formatblock,|color,Font Color,forecolor,|highlight,Text Highlight Color,hilitecolor,color|removeformat,Remove Formatting,|bullets,,insertunorderedlist|numbering,,insertorderedlist|outdent,,|indent,,|alignleft,Align Text Left,justifyleft|center,,justifycenter|alignright,Align Text Right,justifyright|justify,,justifyfull|undo,,|redo,,|rule,Insert Horizontal Rule,inserthorizontalrule|image,Insert Image,insertimage,url|link,Insert Hyperlink,createlink,url|unlink,Remove Hyperlink,|cut,,|copy,,|paste,,|pastetext,Paste as Text,inserthtml,|print,,|source,Show Source"
        },
        imagesPath: function () {
            return U()
        }
    };
    e.fn.cleditor = function (a) {
        var b = e([]);
        this.each(function (c, d) {
            if (d.tagName == "TEXTAREA") {
                var h = e.data(d, Y);
                h || (h = new cleditor(d, a));
                b = b.add(h)
            }
        });
        return b
    };
    var H = "backgroundColor",
        A = "button",
        x = "buttonName",
        F = "change",
        Y = "cleditor",
        q = "click",
        n = "disabled",
        m = "<div>",
        I = "unselectable",
        W = "cleditorButton",
        X = "cleditorDisabled",
        ca = "cleditorPopup",
        S = "cleditorList",
        da = "cleditorColor",
        B = "cleditorPrompt",
        fa = "cleditorMsg",
        l = e.browser.msie,
        ea = /msie\s6/i.test(navigator.userAgent),
        L = /iphone|ipad|ipod/i.test(navigator.userAgent),
        p = {}, Z, s = e.cleditor.buttons;
    e.each(s.init.split("|"), function (a, b) {
        var c = b.split(","),
            d = c[0];
        s[d] = {
            stripIndex: a,
            name: d,
            title: c[1] === "" ? d.charAt(0).toUpperCase() + d.substr(1) : c[1],
            command: c[2] === "" ? d : c[2],
            popupName: c[3] === "" ? d : c[3]
        }
    });
    delete s.init;
    cleditor = function (a, b) {
        var c = this;
        c.options = b = e.extend({}, e.cleditor.defaultOptions, b);
        var d = c.$area = e(a).hide().data(Y, c).blur(function () {
            E(c, true)
        }),
            h = c.$main = e(m).addClass("cleditorMain").width(b.width).height(b.height),
            f = c.$toolbar = e(m).addClass("cleditorToolbar").appendTo(h),
            i = e(m).addClass("cleditorGroup").appendTo(f);
        e.each(b.controls.split(" "), function (g, j) {
            if (j === "") return true;
            if (j == "|") {
                e(m).addClass("cleditorDivider").appendTo(i);
                i = e(m).addClass("cleditorGroup").appendTo(f)
            } else {
                var k = s[j],
                    o = e(m).data(x, k.name).addClass(W).attr("title", k.title).bind(q, e.proxy(aa, c)).appendTo(i).hover(O, P),
                    G = {};
                if (k.css) G = k.css;
                else if (k.image) G.backgroundImage = "url(" + U() + k.image + ")";
                if (k.stripIndex) G.backgroundPosition =
                        k.stripIndex * -24;
                o.css(G);
                l && o.attr(I, "on");
                k.popupName && R(k.popupName, b, k.popupClass, k.popupContent, k.popupHover)
            }
        });
        h.insertBefore(d).append(d);
        if (!Z) {
            e(document).click(function (g) {
                g = e(g.target);
                g.add(g.parents()).is("." + B) || r()
            });
            Z = true
        }
        /auto|%/.test("" + b.width + b.height) && e(window).resize(function () {
            K(c)
        });
        K(c)
    };
    var $ = cleditor.prototype;
    e.each([
        ["clear",
            function (a) {
                a.$area.val("");
                E(a)
            }
        ],
        ["disable", T],
        ["execCommand", v],
        ["focus", w],
        ["hidePopups", r],
        ["sourceMode", t, true],
        ["refresh", K],
        ["select",
            function (a) {
                setTimeout(function () {
                    t(a) ? a.$area.select() : v(a, "selectall")
                }, 0)
            }
        ],
        ["selectedHTML",
            function (a) {
                D(a);
                a = y(a);
                if (l) return a.htmlText;
                var b = e("<layer>")[0];
                b.appendChild(a.cloneContents());
                return b.innerHTML
            },
            true
        ],
        ["selectedText", M, true],
        ["showMessage", z],
        ["updateFrame", E],
        ["updateTextArea", V]
    ], function (a, b) {
        $[b[0]] = function () {
            for (var c = [this], d = 0; d < arguments.length; d++) c.push(arguments[d]);
            c = b[1].apply(this, c);
            if (b[2]) return c;
            return this
        }
    });
    $.change = function (a) {
        var b = e(this);
        return a ? b.bind(F,
            a) : b.trigger(F)
    }
})(jQuery);

/*
 CLEditor XHTML Plugin v1.0.0
 http://premiumsoftware.net/cleditor
 requires CLEditor v1.3.0 or later

 Copyright 2010, Chris Landowski, Premium Software, LLC
 Dual licensed under the MIT or GPL Version 2 licenses.

 Based on John Resig's HTML Parser Project (ejohn.org)
 http://ejohn.org/files/htmlparser.js
 Original code by Erik Arvidsson, Mozilla Public License
 http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
*/
(function (k) {
    var n = k.cleditor.defaultOptions.updateTextArea;
    k.cleditor.defaultOptions.updateTextArea = function (a) {
        if (n) a = n(a);
        return k.cleditor.convertHTMLtoXHTML(a)
    };
    k.cleditor.convertHTMLtoXHTML = function (a) {
        function i(e) {
            var b = {};
            e = e.split(",");
            for (var f = 0; f < e.length; f++) b[e[f]] = true;
            return b
        }

        function v(e, b, f, h) {
            b = b.toLowerCase();
            if (w[b]) for (; c.last() && x[c.last()];) j("", c.last());
            y[b] && c.last() == b && j("", b);
            (h = z[b] || !! h) || c.push(b);
            var l = [];
            f.replace(A, function (D, m, o, p, q) {
                l.push({
                    name: m,
                    escaped: (o ?
                        o : p ? p : q ? q : B[m] ? m : "").replace(/(^|[^\\])"/g, '$1\\"')
                })
            });
            g += "<" + b;
            for (e = 0; e < l.length; e++) g += " " + l[e].name + '="' + l[e].escaped + '"';
            g += (h ? "/" : "") + ">"
        }

        function j(e, b) {
            if (b) {
                b = b.toLowerCase();
                for (f = c.length - 1; f >= 0; f--) if (c[f] == b) break
            } else var f = 0; if (f >= 0) {
                for (var h = c.length - 1; h >= f; h--) g += "</" + c[h] + ">";
                c.length = f
            }
        }

        function r(e, b) {
            g = g.replace(e, b)
        }
        var s = /^<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
            t = /^<\/(\w+)[^>]*>/,
            A = /(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g,
            z = i("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed"),
            w = i("address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul"),
            x = i("a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"),
            y = i("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"),
            B = i("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),
            C = i("script,style"),
            c = [];
        c.last = function () {
            return this[this.length - 1]
        };
        for (var d, u = a, g = ""; a;) {
            if (!c.last() || !C[c.last()]) if (a.indexOf("<!--") == 0) {
                    d = a.indexOf("--\>");
                    if (d >= 0) {
                        g += a.substring(0, d + 3);
                        a = a.substring(d + 3)
                    }
                } else if (a.indexOf("</") == 0) {
                if (d = a.match(t)) {
                    a = a.substring(d[0].length);
                    d[0].replace(t, j)
                }
            } else if (a.indexOf("<") == 0) {
                if (d = a.match(s)) {
                    a = a.substring(d[0].length);
                    d[0].replace(s,
                        v)
                }
            } else {
                d = a.indexOf("<");
                g += d < 0 ? a : a.substring(0, d);
                a = d < 0 ? "" : a.substring(d)
            } else {
                a = a.replace(RegExp("(.*)</" + c.last() + "[^>]*>"), function (e, b) {
                    b = b.replace(/<!--(.*?)--\>/g, "$1").replace(/<!\[CDATA\[(.*?)]]\>/g, "$1");
                    g += b;
                    return ""
                });
                j("", c.last())
            } if (a == u) throw "Parse Error: " + a;
            u = a
        }
        j();
        r(/<b>(.*?)<\/b>/g, "<strong>$1</strong>");
        r(/<i>(.*?)<\/i>/g, "<em>$1</em>");
        return g
    }
})(jQuery);
